home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 8: LINUX Games
/
Linux Cubed Series 8 - LINUX Games.iso
/
games
/
video
/
fly8111-.000
/
fly8111-
/
fly8
/
docs
/
tmac.gm
< prev
next >
Wrap
Text File
|
1979-12-31
|
58KB
|
2,532 lines
.\" Version: modified by rpj@ise.canberra.edu.au
.ds RE 1.04rpj
.ig
Copyright (C) 1991 Free Software Foundation, Inc.
mgm is written by J÷rgen HΣgg (jh@efd.lth.se)
mgm is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 1, or (at your option) any later
version.
mgm is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with groff; see the file LICENSE. If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
Almost complete. The letter format is not included.
Maybe as a separate package.
Should be better as time goes.
-- Changes made by rpj@ise.canberra.edu.au Dec-Jan 1993:
Fix bug in DL list macro causing problem resuming proper indentation
when exited.
Added test for N register in case set on commandline.
All of N=0,1,2,3,4,5 now implemented.
Not sure about N=3 or 5, whether REFERENCES should be output
at the end of each section as they are now. If not then how do I
page number them in the TOC. Have not tested labelled displays
for N=5 which were already done (partially?) in the original.
Fixed bug in .RP missing ()s in .if conditional emmitting .SK.
Added internal @ntc register for nroff/troff conversion of certain
standard spacings ( spacings are divided by @ntc which is
set to 1 for nroff and 2 for troff ie. 1v becomes 0.5v for troff).
This helps to make nroff output a reasonable facsimile of troff.
ie. the following types of spacings are affected:
paragraphs
lists
headers
table of contents
reference lists
macros affected:
par@doit
H
LB
LI
LE
TC ( defined toc*spacing as 1v/\n[@ntc]u )
RF
Fixed bug in table of contents toc@save macro to guarrantee a
space between headernumber and header text in TOC.
Set pa@ind-flag in .P rather than par@doit to indent (para type 2)
second para after header rather than the third.
NEW feature: HEADING "KEEP WITH NEXT"
Minor modifications to the .H macro involving hd*need allows
.H to better detect when a heading should be forced onto the next
page. If there isn't enough space for all of:
Heading pre-space
Heading text (at correct point size - ie. from HP)
Heading post-space if required
First line of following paragraph
then the heading will be output at the top of the next page.
The call to the user macro HY has been moved later in .H after
the heading point size has been set from HP. I'm not sure if this
is correct but the book I have lists it as "User supplied exit
macro in middle of printing heading".
NEW feature: PROPORTIONAL HEADING PRE-SPACE
It is very convenient if Heading pre-space is relative to
heading point size. This can't be done with the current
definition of registers Hps1 and Hps2 being arbitrarily
scaleable to whatever point size is in force at the time they're
set, nor can they be used (from within .H) to take account of point
sizes set in string HP.
To do this I have added two new registers Hpps1 and
Hpps2 (Heading proportional pre-space). To allow fractional values
and/or carry the scaling letter through until it's actual usage,
Hpps1 and Hpps2 were made string registers. It is intended
that the "value" will either be unscaled or use v, m or n, but other
"absolute" scales can be used. These *strings* should only be
used as an argument to .SP.
A new macro, .HPPS can be used to set Hpps1, Hpps2, Hps1,
and Hps2 all at once. This is the preferred way of setting the
new registers since it hides the fact that they're strings
(whereas Hps1/Hps2 are numbers).
.H has been modified to call .S rather than set .ps
directly so that .vs is set appropriately for the new registers
to work. As a result the hd*save-ps register isn't needed.
-- END (rpj@ise.canberra.edu.au)
Please send bugreports with examples to jh@efd.lth.se.
Naming convention stolen from mgs.
Local names module*name
Extern names module@name
Env.var environ:name
Index array!index
..
.warn
.\" ####### init ######
.\" Contents level [0:7], contents saved if heading level <= Cl
.nr Cl 2
.\" Eject page between LIST OF XXXX if Cp == 0
.nr Cp 0
.\" Debugflag
.if !r D .nr D 0
.\" Eject after floating display is output [0:1]
.nr De 0
.\" Floating keep output [0;5]
.nr Df 5
.\" space before and after display if == 1 [0:1]
.nr Ds 1
.\" Eject page
.nr Ej 0
.\" Eqation lable adjust 0=left, 1=right
.nr Eq 0
.\" Em dash string
.ds EM \-
.\" Footnote spacing
.nr Fs 1
.\" H1-H7 heading counters
.nr H1 0 1
.nr H2 0 1
.nr H3 0 1
.nr H4 0 1
.nr H5 0 1
.nr H6 0 1
.nr H7 0 1
.\" Heading break level [0:7]
.nr Hb 2
.\" heading centering level, [0:7]
.nr Hc 0
.\" header format
.ds HF 2 2 2 2 2 2 2
.\" heading temp. indent [0:2]
.\" 0 -> 0 indent, left margin
.\" 1 -> indent to right , like .P 1
.\" 2 -> indent to line up with text part of preceding heading
.nr Hi 1
.\" header pointsize
.ds HP 0 0 0 0 0 0 0
.\" heading space level [0:7]
.nr Hs 2
.\" heading numbering type
.\" 0 -> multiple (1.1.1 ...)
.\" 1 -> single
.nr Ht 0
.\" Unnumbered heading level
.nr Hu 2
.\" hyphenation in body
.\" 0 -> no hyphenation
.\" 1 -> hyphenation 14 on
.nr Hy 1
.\" text for toc, selfexplanatory. Look in the new variable section
.ds Lf LIST OF FIGURES
.nr Lf 1
.ds Lt LIST OF TABLES
.nr Lt 1
.ds Lx LIST OF EXHIBITS
.nr Lx 1
.ds Le LIST OF EQUATIONS
.nr Le 0
.\" List indent, used by .AL
.nr Li 6
.\" List space, if listlevel > Ls then no spacing will occur around lists.
.nr Ls 99
.\" Numbering style [0:5]
.if !r N .nr N 0
.\" numbered paragraphs
.\" 0 == not numbered
.\" 1 == numbered in first level headings.
.nr Np 0
.\" Format of figure,table,exhibit,equation titles.
.\" 0= ". ", 1=" - "
.nr Of 0
.\" paragraph indent
.nr Pi 5
.\" paragraph spacing
.nr Ps 1
.\" paragraph type
.\" 0 == left-justified
.\" 1 == indented .P
.\" 2 == indented .P except after .H, .DE or .LE.
.nr Pt 0
.\" Reference title
.ds Rp REFERENCES
.\" Display indent
.nr Si 5
.\"
.ds Tm \(tm
.\"
.\"---------------------------------------------
.\" Internal global variables
.\"
.\" These two are for cover macro .MT
.\" Change @langage in the national file.
.ds @cur-lib /usr/local/lib/groff/tmac
.\" .ds @language
.\" Current pointsize and vertical space, always in points.
.nr @ps 10
.nr @vs 12
.\" Page length
.ie r L .nr @pl \n[L]
.el .nr @pl 11i
.\" page width
.ie r W .nr @ll \n[W]
.el .nr @ll 6i
.\" page offset
.ie r O .nr @po \n[O]
.el .nr @po 1i
.\"
.\" nroff/troff conversion value for size of blank line (rpj)
.ie t .nr @ntc 2
.el .nr @ntc 1
.\"
.\" cheating...
.\".pl 100i
.pl \n[@pl]u
.ll \n[@ll]u
.po \n[@po]u
.nr @cur-ll \n[@ll]
.\"---------------------------------------------
.\" New variables
.\"
.\" Appendix name
.ds App APPENDIX
.\" print appendixheader, 0 == don't
.nr Aph 1
.\"
.\" header prespace level. If level <= Hps, then two lines will be printed
.\" before the header instead of one.
.nr Hps 1
.\"
.\" These variables controls the number of lines preceding .H.
.\" Hps1 is the number of lines when level > Hps
.nr Hps1 0.5v
.if n .nr Hps1 1v
.\"
.\" Hps2 is the number of lines when level <= Hps
.nr Hps2 1v
.if n .nr Hps2 2v
.\"
.\" These *string* variables control the proportional heading pre-space.
.\" If no scaling character is used, or v, m or n is used, then the value
.\" is relative to the heading point size when output. This is how it's
.\" meant to be used, but other scalings can be used for absolute sizes.
.\" They default to 0 for compatibility.
.\" The macro
.\" .HPPS [Hpps1] [Hpps2] [Hps1] [Hps2]
.\" has been included to provide a preferred method of setting these
.\" values.
.\" Hpps1 is the vertical pre-space when level > Hps
.if !d Hpps1 .ds Hpps1 0v
.\"
.\" Hpps2 is the vertical pre-space when level <= Hps
.if !d Hpps2 .ds Hpps2 0v
.\"
.\" flag for mkindex
.if !r Idxf .nr Idxf 0
.\" Change these in the national configuration file
.ds Lifg Figure
.ds Litb TABLE
.ds Liex Exhibit
.ds Liec Equation
.ds Licon CONTENTS
.\"
.\" Lsp controls the height of an empty line. Normally 0.5v
.nr Lsp 0.5v
.if n .nr Lsp 1v
.ds MO1 January
.ds MO2 February
.ds MO3 March
.ds MO4 April
.ds MO5 May
.ds MO6 June
.ds MO7 July
.ds MO8 August
.ds MO9 September
.ds MO10 October
.ds MO11 November
.ds MO12 December
.\" for GETR
.ds Qrf See chapter \\*[Qrfh], page \\*[Qrfp].
.\" test for mgm macro. This can be used if the text must test
.\" what macros is used.
.nr .mgm 1
.\"
.\"---------------------------------------------
.\" set local variables.
.ie d @language .mso mm/\\*[@language]_locale
.el .mso mm/locale
.\"---------------------------------------------
.if \n[D] .tm Groff mm, version \*[RE].
.\" ####### module init ######
.\" reset all things
.de init@reset
.ie \\n[misc@adjust] 'ad
.el 'na
.ie \\n[Hy] 'hy 14
.el 'nh
'in 0
'ti 0
'ps \\n[@ps]
'vs \\n[@vs]
..
.de @error
.tm ******************
.tm ERROR:(\\n[.F]) input line \\n[.c]:\\$*
.if \\n[D] .backtrace
.tm ******************
.ab
..
.\" ####### module debug #################################
.de debug
.tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s],\\n[.ps] \
in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%]
..
.de debug-all
.nr debug*n 1n
.nr debug*m 1m
.tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s] in=\\n[.i]\
ad=\\n[.j] fi=\\n[.u] pl=\\n[.p] page=\\n[%] .o=\\n[.o]
.tm _______ .d=\\n[.d] .f=\\n[.f] .h=\\n[.h] .k=\\n[.k] .n=\\n[.n]\
.p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n]
..
.\" ####### module par #################################
.nr par@ind-flag 1 \" indent on following P if Pt=2
.nr hd*last-pos -1
.nr hd*last-hpos -1
.nr par*number 0 1
.af par*number 01
.nr par*num-count 0 1
.af par*num-count 01
.\" reset numbered paragraphs, arg1 = headerlevel
.de par@reset-num
.if \\$1<3 .nr par*num-count 0
.if (\\$1=1)&(\\n[Np]=1) .nr par*number 0
..
.\"------------
.\" paragraph
.de P
.\" skip P if previous heading
.ie !((\\n[nl]=\\n[hd*last-pos]):(\\n[nl]=(\\n[hd*last-pos]-.5v))) \{\
. if \\n[D]>2 .tm Paragraph
. par@doit \\$*
.\}
.el .if !(\\n[hd*last-hpos]=\\n[.k]) \{\
. if \\n[D]>2 .tm Paragraph
. par@doit \\$*
.\}
.nr par@ind-flag 1
..
.de par@doit
.SP \\n[Ps]/\\n[@ntc]u
.ie \\n[.$] \{\
. if \\$1=1 .ti +\\n[Pi]n
.\}
.el \{\
. if \\n[Pt]=1 .ti +\\n[Pi]n
. if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n
.\}
.if \\n[Np] \{\
\\n[H1].\\n+[par*number]\ \ \c
.\" $$$ 'br
.\}
..
.\" ####### module line #######################################
.de SP
.br
.if !r line*lp\\n[.z] .nr line*lp\\n[.z] 0
.if !r line*ac\\n[.z] .nr line*ac\\n[.z] 0
.ie \\n[.$] .nr line*temp (v;\\$1)
.el .nr line*temp 1v
.\"
.ie \\n[line*lp\\n[.z]]=\\n[.d] \{\
. \" go here if no output since the last .SP
. nr line*output \\n[line*temp]-\\n[line*ac\\n[.z]]
. if \\n[line*output]<0 .nr line*output 0
. nr line*ac\\n[.z] +\\n[line*output]
.\}
.el \{\
. nr line*ac\\n[.z] \\n[line*temp]
. nr line*output \\n[line*temp]
. \" no extra space in the beginning of a page
. if (\\n[.d]<0):(\\n[pg*head-mark]=\\n[.d]) .nr line*output 0
.\}
.if \\n[line*output] .sp \\n[line*output]u
.nr line*lp\\n[.z] \\n[.d]
..
.\" ######## module misc ###############
.nr misc@adjust 14
.de SA
.if \\n[.$] \{\
. if \\$1-1 .@error "SA: bad arg: \\$1"
. nr misc@adjust 0\\$1
.\}
.ie \\n[misc@adjust] 'ad
.el 'na
..
.\"-------------
.\" switch environment, keep all important settings.
.de misc@ev-keep
.nr misc*ll \\n[.l]
.ev \\$1
.ll \\n[misc*ll]u
..
.\"-------------
.\" .misc@push stackname value
.de misc@push
.ie d misc*st-\\$1 .ds misc*st-\\$1 \\$2 \\*[misc*st-\\$1]
.el .ds misc*st-\\$1 \\$2
..
.\"-------------
.\" .misc@pop stackname
.\" value returned in the string misc*pop
.de misc@pop
.misc@pop-set misc*st-\\$1 \\*[misc*st-\\$1]
..
.\"-------------
.de misc@pop-set
.ds misc*st-name \\$1
.shift
.if \\n[.$]<1 .@error "stack \\*[misc*st-name] empty"
.ds misc*pop \\$1
.shift
.ds \\*[misc*st-name] \\$*
..
.\"-------------
.\" .misc@pop-nr stackname varname
.de misc@pop-nr
.misc@pop \\$1
.nr \\$2 \\*[misc*pop]
..
.\"-------------
.\" .misc@pop-ds stackname varname
.de misc@pop-ds
.misc@pop \\$1
.ds \\$2 \\*[misc*pop]
..
.\"-----------
.\" reset tabs
.de TAB
.ta T 5n
..
.\"-------------
.\" .PGFORM linelength [ pagelength [ pageoffset ] ]
.de PGFORM
.if !''\\$1' .nr @ll \\$1
.if !''\\$2' .nr @pl \\$2
.if !''\\$3' .nr @po \\$3
.ll \\n[@ll]u
.po \\n[@po]u
.pl \\n[@pl]u
.nr @cur-ll \\n[@ll]
.in 0
.pg@move-trap
..
.\"-------------
.\" .MOVE y [[x] linelength]
.\" move to line y, indent to x
.de MOVE
.if !\\n[.$] .@error "MOVE y [x]: no arguments"
.if \\n[nl]<0 \c
.sp |(v;\\$1)
.ie \\n[.$]>2 .nr pg*i (v;\\$3)
.el \{\
. ie \\n[.$]>1 .nr pg*i (v;\\n[@ll]u-\\$2)
. el .nr pg*i (v;\\n[@ll]u)
.\}
.if !''\\$2' \{\
. po \\$2
. ll \\n[pg*i]u+\\n[@po]u
.\}
..
.\"-------------
.de SM
.if !\\n[.$] .@error "SM: no arguments"
.if \\n[.$]=1 \s-1\\$1\s0
.if \\n[.$]=2 \s-1\\$1\s0\\$2
.if \\n[.$]=3 \\$1\s-1\\$2\s0\\$3
..
.\"-------------
.nr misc*S-ps \n[@ps]
.nr misc*S-vs \n[@vs]
.nr misc*S-ps1 \n[@ps]
.nr misc*S-vs1 \n[@vs]
.ds misc*a
.ds misc*b
.de S
.ie !\\n[.$] \{\
. ds misc*a P
. ds misc*b P
.\}
.el \{\
. ie \\n[.$]=1 .ds misc*b D
. el \{\
. ie \w'\\$2'=0 .ds misc*b C
. el .ds misc*b \\$2
. \}
. ie \w'\\$1'=0 .ds misc*a C
. el .ds misc*a \\$1
.\}
.\" set point size
.if !'\\*[misc*a]'C' \{\
. ie '\\*[misc*a]'P' .nr @ps \\n[misc*S-ps]
. el \{\
. ie '\\*[misc*a]'D' .nr @ps 10
. el .nr @ps \\*[misc*a]
. \}
.\}
.\" set vertical spacing
.if !'\\*[misc*b]'C' \{\
. ie '\\*[misc*b]'P' .nr @vs \\n[misc*S-vs]
. el \{\
. ie '\\*[misc*b]'D' .nr @vs \\n[@ps]+2
. el .nr @vs \\*[misc*b]
. \}
.\}
'ps \\n[@ps]
'vs \\n[@vs]
.if \\n[D]>1 .tm point-size \\n[@ps] (\\n[.s]), vertical spacing \\n[@vs] (\\n[.v])
.nr misc*S-ps \\n[misc*S-ps1]
.nr misc*S-vs \\n[misc*S-vs1]
.nr misc*S-ps1 \\n[@ps]
.nr misc*S-vs1 \\n[@vs]
..
.\"------------
.de HC
.ev 0
.hc \\$1
.ev
.ev 1
.hc \\$1
.ev
.ev 2
.hc \\$1
.ev
..
.\"------------
.de RD
.di misc*rd
'fl
.rd \\$1
.br
.di
.ie !''\\$3' \{\
. di misc*rd2
. ds \\$3 "\\*[misc*rd]
. br
. di
.\}
.if !''\\$2' .rn misc*rd \\$2
.rm misc*rd misc*rd2
..
.\"------------
.de VERBON
.br
.misc@ev-keep misc*verb-ev
.nf
.ft CR
.ss 12
.ta T 8u*\w'n'u
..
.de VERBOFF
.ev
..
.\" ######## module acc #################
.\"-----------
.\" accents. These are copied from mgs, written by James Clark.
.de acc@over-def
.ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
\h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
..
.de acc@under-def
.ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
..
.acc@over-def ` \`
.acc@over-def ' \'
.acc@over-def ^ ^
.acc@over-def ~ ~
.acc@over-def : \(ad
.acc@over-def ; \(ad
.acc@under-def , \(ac
.\" ######## module uni #################
.\" unimplemented macros
.de OK
.tm "OK: not implemented"
..
.de PM
.tm "PM: not implemented"
..
.\" ######## module hd #################
.\" support for usermacro
.nr hd*htype 0
.ds hd*mark
.ds hd*suf-space
.nr hd*need 0
.aln ;0 hd*htype
.als }0 hd*mark
.als }2 hd*suf-space
.aln ;3 hd*need
.\"-------------
.\" .hd@split varable index name val1 val2 ...
.de hd@split
.if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]).
.nr hd*sp-tmp \\$2+3
.ds \\$1 \\$[\\n[hd*sp-tmp]]
..
.de HU
.H 0 "\\$1"
..
.de HPPS
.if \\n[.$]>=1 .ds Hpps1 \\$1
.if \\n[.$]>=2 .ds Hpps2 \\$2
.if \\n[.$]>=3 .nr Hps1 \\$3
.if \\n[.$]>=4 .nr Hps2 \\$4
..
.\"-------------
.de H
.nr hd*cur-bline \\n[nl]
.br
.ds@print-float 2\" $$$ could be wrong...
.\" terminate all lists
.LC 0
.init@reset
.nr hd*level 0\\$1
.nr hd*arg1 0\\$1
.if !\\n[hd*level] .nr hd*level \\n[Hu]
.\" Check if it's time for new page.
.if \\n[Ej]&(\\n[Ej]>=\\n[hd*level]) \{\
. ie \\n[pg*ref-reset] \{\
. if d ref*div \{\
.\" Do references for this section
. ie \\n[hd*cur-bline]>=0 .RP 0 0\" Break before and after
. el .RP 0 2\" Break after
. \}
. \}
. el .if \\n[hd*cur-bline]>=0 .pg@next-page
. if \\n[pg*sect-reset] \{\
.\" Reset footnotes and page number
. FD "" 1
. nr P 1
. \}
.\}
.\" clear lower counters
.nr hd*i 1 1
.while \\n+[hd*i]<8 .if \\n[hd*level]<\\n[hd*i] .nr H\\n[hd*i] 0 1
.\"
.\" increment current counter
.nr H\\n[hd*level] +1
.\" Pre-space only if not at top of page
.if \\n[hd*cur-bline]>\\n[pg*top-nl] \{\
. ie \\n[hd*level]<=\\n[Hps] .SP \\n[Hps2]u\" pre-space
. el .SP \\n[Hps1]u
.\}
.\"
.\" hd*mark is the text written to the left of the header.
.ds hd*mark \\n[H1].
.if \\n[hd*level]>1 .as hd*mark \\n[H2]
.nr hd*i 2 1
.while \\n+[hd*i]<8 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]]
.if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]].
.\"
.\" toc-mark is sent to the table of contents
.ds hd*toc-mark \\*[hd*mark]
.as hd*mark \ \ \" add spaces between mark and heading
.if !\\n[hd*arg1] \{\
. ds hd*mark\" no mark for unnumbered
. ds hd*toc-mark
.\}
.\"
.if \\n[D]>1 .tm At header \\*[hd*toc-mark] "\\$2"
.nr hd*htype 0 \" hd*htype = check break and space
. \" 0 = run-in, 1 = break only, 2 = space
.if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1
.if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2
. \" two spaces if hd*htype == 0
.ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space " \"
.el .ds hd*suf-space
.\" Header "need space" is calculated as follows (in order):
.\" 1v at current .vs assumed for first line of following para.
.\" (ie. ensure "keep with next")
.\" + 1 blank vertical space if space after heading (0.5v troff, 1v nroff)
.\" + height of heading at heading point size
.nr hd*need 1v \" hd*need = header need space
.if \\n[hd*htype]>=2 .nr hd*need +1v/\\n[@ntc]u\" add some extra space
.\"---------- user macro HX ------------
.\" user exit macro to override numbering
.if d HX .HX \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
.par@reset-num \\n[hd*level]\" reset numbered paragraph
.if \\n[hd*htype] .na \" no adjust if run-in
.hd@split hd*font \\n[hd*level] HF \\*[HF]\" get font for this level
.ft \\*[hd*font]\" set new font
.\" .nr hd*ps-save \\n[.ps]u
.hd@split hd*new-ps \\n[hd*level] HP \\*[HP]\" get point size
.ie (\\*[hd*new-ps]=0):(\w@\\*[hd*new-ps]@=0) \{\
. if \\n[hd*htype] \{\
. if '\\*[hd*font]'3' .S -1
. if '\\*[hd*font]'B' .S -1
. \}
.\}
.el .S \\*[hd*new-ps]
.\" Do additional pre-space proportional to heading point size
.\" but only if normal pre-space didn't cause a new page trap
.nr hd*cur-bline \\n[nl]
.if \\n[hd*cur-bline]>\\n[pg*top-nl] \{\
. ie \\n[hd*level]<=\\n[Hps] .SP \\*[Hpps2]
. el .SP \\*[Hpps1]
.\}
.di hd*div
\\*[hd*mark]\\$2\\$3\\*[hd*suf-space]
.br
.di
.rm hd*div
.ne \\n[hd*need]u+\\n[dn]u+.5p \" this is the needed space for a header
.\"---------- user macro HY -------------
.\" user macro to reset indents
.if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
.nr hd*mark-size \w'\\*[hd*mark]'
.if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc
.\"
.\" finally, output the header
\\*[hd*mark]\&\c
.\" and the rest of the header
.ie \\n[hd*htype] \{\
\\$2\\$3
. br
.\}
.el \\$2\\$3\\*[hd*suf-space]\&\c
.ft 1
.S P P
.\"
.\" table of contents
.if (\\n[hd*level]<=\\n[Cl])&\w@\\$2@ \{\
. toc@save \\n[hd*level] "\\*[hd*toc-mark]" "\\$2" "\\*[pg*toc-pn-fmt]"
.\}
.\" set adjust to previous value
.SA
.\" do break or space
.if \\n[hd*htype] .br
.if \\n[hd*htype]>1 .SP 1/\\n[@ntc]u
.if \\n[hd*htype] \{\
. \" indent if Hi=1 and Pt=1
. if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n
. \" indent size of mark if Hi=2
. if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u
.\}
.nr par@ind-flag 0 \" no indent on .P if Pt=2
.\"
.\" check if it is time to reset footnotes
.if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1
.\"
.\" check if it is time to reset indexes
.if (\\n[hd*level]=1)&(\\n[pg*label-reset]) \{\
. nr lix*fg-nr 0 1
. nr lix*tb-nr 0 1
. nr lix*ec-nr 0 1
. nr lix*ex-nr 0 1
.\}
.\"---------- user macro HZ ----------
.if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
.nr hd*last-pos \\n[nl]
.nr hd*last-hpos \\n[.k]
.nr par@ind-flag 0
..
.\"--------
.de HM
.nr hd*i 0 1
.while \\n+[hd*i]<8 .af H\\n[hd*i] \\$[\\n[hd*i]] 1
..
.\"########### module pg ####################
.\" set end of text trap
.wh 0 pg@header
.em pg@end-of-text
.\"
.ds pg*header ''- % -''
.ds pg*even-footer
.ds pg*odd-footer
.ds pg*even-header
.ds pg*odd-header
.ds pg*footer
.\"
.nr pg*top-margin 0
.nr pg*foot-margin 0
.nr pg*block-size 0
.nr pg*footer-size 5\" 1v+footer+even/odd footer+2v
.nr pg*header-size 7\" 3v+header+even/odd header+2v
.nr ft*note-size 0
.nr pg*cur-column 0
.nr pg*cols-per-page 1
.nr pg*cur-po \n[@po]
.nr pg*head-mark 0
.nr pg*sect-reset 0
.nr pg*ref-reset 0
.nr pg*label-reset 0
.ds pg*toc-pn-fmt "\\\\n[P]
.nr pg*top-nl 0
.\"
.nr pg*ps \n[@ps]
.nr pg*vs \n[@vs]
.\" compatibility reasons. Why not use %??
.aln P %
.\"-------------------------
.\" footer traps: set, enable and disable
.de pg@set-new-trap
.nr pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]v)
.if \\n[D]>2 .tm pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]v) = \\n[pg*foot-trap]
.\" last-pos points to the position of the footer and bottom
.\" block below foot-notes.
.nr pg*last-pos \\n[@pl]u-(\\n[pg*block-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]v)
..
.de pg@enable-trap
.wh \\n[pg*foot-trap]u pg@footer
.if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl]
..
.de pg@disable-trap
.ch pg@footer
..
.\" move to new trap (if changed).
.de pg@move-trap
.pg@disable-trap
.pg@set-new-trap
.pg@enable-trap
..
.de pg@enable-top-trap
.\" set trap for pageheader.
.nr pg*top-enabled 1
..
.de pg@disable-top-trap
.\" remove trap for pageheader.
.nr pg*top-enabled 0
..
.\" no header on the next page
.de PGNH
.nr pg*top-enabled -1
..
.\" set first trap for pagefooter
.pg@enable-top-trap
.pg@set-new-trap
.pg@enable-trap
.\"-------------------------
.\" stop output and begin on next page. Fix footnotes and all that.
.de pg@next-page
.\".debug next-page
.ne 999i \" activate trap
.\" .pg@footer
..
.\"-------------------------
.\" support for PX and TP
.als }t pg*header
.als }e pg*even-header
.als }o pg*odd-header
.\"------------------------------------------------------------
.\" HEADER
.de pg@header
.if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.])
.if \\n[Idxf] \{\
.tl '<pagenr\ \\n[%]>'''
.\}
.nr pg*top-nl \\n[nl]
.if \\n[pg*top-enabled] \{\
. if \\n[pg*top-margin] .sp \\n[pg*top-margin]u
. ev pg*tl-ev
. pg@set-env
. ie !d TP \{\
' sp 3
. lt \\n[@ll]u
. ie (\\n[%]=1)&((\\n[N]=1):(\\n[N]=2)) \{\
. tl ''''
. \}
. el \{\
. tl \\*[pg*header]
. ie o .tl \\*[pg*odd-header]
. el .tl \\*[pg*even-header]
. \}
' sp 2
. \}
. el .TP
. ev
. \" why no-space??
. if d PX \{\
. ns
. PX
. rs
. \}
. nr pg*top-nl \\n[nl]
. \" check for pending footnotes
. ft@check-old
. \"
. \" back to normal text processing
. \" .pg@enable-trap
. \" mark for multicolumn
. nr pg*head-mark \\n[nl]u
. \" set multicolumn
. \"
. pg@set-po
. \" print floating displays
. ds@print-float 4
. tbl@top-hook
.\}
.if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1
..
.\"---------------------------------------------------------
.\" FOOTER
.de pg@footer
.pg@disable-trap
.\".debug footer
.tbl@bottom-hook
.\" increment pageoffset for MC
.\" move to the exact start of footer.
'sp |\\n[pg*foot-trap]u+1v
.\"
.if \\n[D]>3 .tm FOOTER after .sp
.\" print footnotes
.if d ft*div .ft@print
.\"
.pg@inc-po
.if !\\n[pg*cur-column] .pg@print-footer
.\" next column
.pg@set-po
.pg@enable-trap
..
.\"-------------------------
.de pg@print-footer
.\" jump to the position just below the foot-notes.
'sp |\\n[pg*last-pos]u+1v
.\" check if there are any bottom block
.if d pg*block-div .pg@block
.\"
.\" print the footer and eject new page
.ev pg*tl-ev
.pg@set-env
.lt \\n[@ll]u
.ie (\\n[%]=1)&(\\n[N]=1) \{\
. tl \\*[pg*header]
.\}
.el \{\
. ie o .tl \\*[pg*odd-footer]
. el .tl \\*[pg*even-footer]
. tl \\*[pg*footer]
.\}
.ev
.ie (\\n[ds*fnr]>=\\n[ds*o-fnr]):\\n[ft*exist] \{\
. ev ne
' bp
. ev
.\}
.el 'bp
..
.\"-------------------------
.\"
.\" Initialize the title environment
.de pg@set-env
'na
'nh
'in 0
'ti 0
'ps \\n[pg*ps]
'vs \\n[pg*vs]
..
.\"-------------------------
.de PH
.ds pg*header "\\$1
.pg@set-new-size
..
.de PF
.ds pg*footer "\\$1
.pg@set-new-size
..
.de OH
.ds pg*odd-header "\\$1
.pg@set-new-size
..
.de EH
.ds pg*even-header "\\$1
.pg@set-new-size
..
.de OF
.ds pg*odd-footer "\\$1
.pg@set-new-size
..
.de EF
.ds pg*even-footer "\\$1
.pg@set-new-size
..
.de pg@clear-hd
.ds pg*even-header
.ds pg*odd-header
.ds pg*header
..
.de pg@clear-ft
.ds pg*even-footer
.ds pg*odd-footer
.ds pg*footer
..
.de pg@set-new-size
.nr pg*ps \\n[@ps]
.nr pg*vs \\n[@vs]
.pg@move-trap
..
.\"-------------------------
.\" Section-page as footer, new page for section
.if \n[N]=3 \{\
. nr Ej 1
. nr pg*sect-reset 1
. nr pg*ref-reset 1
. ds pg*toc-pn-fmt "\\\\n[H1]-\\\\n[P]
. PF "''\\\\n[H1]-\\\\n[P]''"
. PH
.\}
.\" No headers unless user sets it with .PH
.if \n[N]=4 \{\
. PH
. nr N 0
.\}
.\" Section-page as footer, new page for section, reset label numbers
.if \n[N]=5 \{\
. nr Ej 1
. nr pg*sect-reset 1
. nr pg*ref-reset 1
. nr pg*label-reset 1
. ds pg*toc-pn-fmt "\\\\n[H1]-\\\\n[P]
. PF "''\\\\n[H1]-\\\\n[P]''"
. PH
.\}
.\"-------------------------
.\" end of page processing
.de pg@footnotes
.\".debug footnotes
.\" output footnotes. set trap for block
.\"
..
.\"-------------------------
.\" print bottom block
.de pg@block
.ev pg*block-ev
'nf
'in 0
.ll 100i
.pg*block-div
.br
.ev
..
.\"-------------------------
.\" define bottom block
.de BS
.misc@ev-keep pg*block-ev
.init@reset
.br
.di pg*block-div
..
.\"-------------------------
.de BE
.br
.di
.nr pg*block-size \\n[dn]u
.ev
.pg@move-trap
..
.\"-------------------------
.\" print out all pending text
.de pg@end-of-text
.\" non-empty environment
.misc@ev-keep ne
.init@reset
\c
.ds@print-float 3
.ev
.if d ref*div .RP 0 1\" No break after (last page)
..
.\"-------------------------
.\" set top and bottom margins $$$ (not implemented yet)
.de VM
..
.\"---------------------
.\" multicolumn output.
.de pg@set-po
.if \\n[pg*cols-per-page]>1 \{\
. ll \\n[pg*column-size]u
.\}
..
.de pg@inc-po
.if \\n[pg*cols-per-page]>1 \{\
. ie \\n+[pg*cur-column]>=\\n[pg*cols-per-page] \{\
. nr pg*cur-column 0 1
. nr pg*cur-po \\n[@po]u
. po \\n[@po]u
. ll \\n[@ll]u
. \}
. el \{\
. nr pg*cur-po +(\\n[pg*column-size]u+\\n[pg*column-sep]u)
. po \\n[pg*cur-po]u
' sp |\\n[pg*head-mark]u
. \}
.\}
..
.de 1C
.br
.if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active"
.nr pg*cols-per-page 1
.nr pg*column-sep 0
.nr pg*column-size \\n[@ll]
.nr pg*cur-column 0 1
.nr pg*cur-po \\n[@po]u
.PGFORM
.\".pg@next-page
.SK
..
.de 2C
.br
.nr pg*head-mark \\n[nl]u
.if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active"
.nr pg*cols-per-page 2
.nr pg*column-sep \\n[@ll]/15
.nr pg*column-size (\\n[@ll]u*7)/15
.nr pg*cur-column 0 1
.nr pg*cur-po \\n[@po]u
.ll \\n[pg*column-size]u
..
.\" MC column-size [ column-separation ]
.de MC
.br
.nr pg*head-mark \\n[nl]u
.if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active"
.ie ''\\$1' .nr pg*column-size \\n[.l]
.el .nr pg*column-size (n;\\$1)
.ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15
.el .nr pg*column-sep (n;\\$2)
.\"
.nr pg*cols-per-page (u;\\n[.l]/(\\n[pg*column-size]+\\n[pg*column-sep]+1))
.nr pg*cur-column 0 1
.nr pg*cur-po \\n[@po]u
.ll \\n[pg*column-size]u
..
.\" skip pages
.de SK
.br
.bp
.nr pg*i 0 1
.while \\n+[pg*i]<=(0\\$1) .bp
..
.\"-----------
.de OP
.br
.ie o .if !\\n[pg*head-mark]=\\n[nl] .bp +2
.el .bp
..
.\"########### module footnotes ###################
.nr ft*note-size 0
.nr ft*busy 0
.nr ft*nr 0 1
.nr ft*wide 0
.nr ft*format 0
.nr ft*hyphen 0\" hyphenation value
.nr ft*adjust 1\" >0 if adjust true
.nr ft*indent 1\" >0 if text indent true (not imp. $$$)
.nr ft*just 0\" 0=left justification, 1=right (not imp. $$$)
.nr ft*exist 0\" not zero if there are any footnotes to be printed
.nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head.
.\"
.ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m'
.\"
.\"-----------------
.\" init footnote environment
.de ft@init
.\" indentcontrol not implemented $$$
.\" label justification not implemented $$$
'in 0
'fi
.ie \\n[ft*adjust] 'ad
.el 'na
.ie \\n[ft*hyphen] 'hy 14
.el 'hy 0
.ll \\n[@cur-ll]u
.ps (\\n[@ps]-2)
.vs (\\n[@vs]-1)
..
.\"-----------------
.\" set footnote format
.\" no support for two column processing (yet). $$$
.de FD
.if \\n[.$]=0 .@error "FD: bad arg \\$1"
.if \w'\\$1' \{\
. ie \\$1>11 .nr ft*format 0
. el .nr ft*format \\$1
.\}
.\"
.ie \\n[.$]=2 .nr ft*clear-at-header 1
.el .nr ft*clear-at-header 0
.\"
.nr ft*hyphen (\\n[ft*format]%2)*14
.nr ft*format \\n[ft*format]/2
.\"
.nr ft*adjust 1-(\\n[ft*format]%2)
.nr ft*format \\n[ft*format]/2
.\"
.nr ft*indent 1-(\\n[ft*format]%2)
.nr ft*format \\n[ft*format]/2
.\"
.nr ft*just \\n[ft*format]%2
..
.\"---------------
.\" Footnote and display width control $$$
.de WC
.nr ft*i 0 1
.while \\n+[ft*i]<=\\n[.$] \{\
. ds ft*x \\$[\\n[ft*i]]
. if '\\*[ft*x]'N' \{\
. nr ft*wide 0
. nr ft*first-fn 0
. nr ds*wide 0
. nr ds*float-break 1
. \}
. if '\\*[ft*x]'-WF' .nr ft*wide 0
. if '\\*[ft*x]'WF' .nr ft*wide 1
. if '\\*[ft*x]'-FF' .nr ft*first-fn 0
. if '\\*[ft*x]'FF' .nr ft*first-fn 1
. if '\\*[ft*x]'-WD' .nr ds*wide 0
. if '\\*[ft*x]'WD' .nr ds*wide 1
. if '\\*[ft*x]'-FB' .nr ds*float-break 0
. if '\\*[ft*x]'FB' .nr ds*float-break 1
.\}
..
.\"-----------------
.\" begin footnote
.de FS
.if \\n[ft*busy] .@error "FS: missing FE"
.nr ft*busy 1
.ev ft*ev
.ft@init
.if !\\n[ft*wide] .pg@set-po
.if !d ft*div .ft@init-footnote
.di ft*tmp-div
.nr ft*space \\n[Fs]v/2u
.sp \\n[ft*space]u
.\" print mark
.ie \\n[.$] .ds ft*mark \\$1
.el .ds ft*mark \\n[ft*nr].
\\*[ft*mark]
.in +.75c
.sp -1
.nr ft*exist 1
..
.\"-----------------
.\" init footnote diversion
.de ft@init-footnote
.di ft*div
\l'20n'
.br
.di
.nr ft*note-size \\n[dn]
..
.\"-----------------
.\" end footnote
.de FE
.nr ft*busy 0
.br
.di
'in 0
'nf
.if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote"
.ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\
. da ft*next-div
. ft*tmp-div
. br
. di
.\}
.el \{\
. da ft*div
. ft*tmp-div
. di
. nr ft*note-size +\\n[dn]
.\}
.rm ft*tmp-div
.ev
.pg@move-trap
..
.\"-----------------
.\" print footnotes, see pg@footer
.de ft@print
.ev ft*print-ev
'nf
'in 0
.ll 100i
.ft*div
.br
.ev
.rm ft*div
.nr ft*note-size 0
.pg@move-trap
..
.\"-----------------
.\" check if any pending footnotes, see pg@header
.de ft@check-old
.if d ft*next-div \{\
. ev ft*ev
. ft@init
. ft@init-footnote
. nf
. in 0
. da ft*div
. ft*next-div
. di
. nr ft*note-size +\\n[dn]
. rm ft*next-div
. ev
. nr ft*exist 0
. pg@move-trap
.\}
..
.\"########### module display ###################
.nr ds*wide 0\" >0 if wide displays wanted
.nr ds*fnr 0 1\" floating display counter
.nr ds*o-fnr 1\" floating display counter, already printed
.nr ds*snr 0 1\" static display counter
.nr ds*lvl 0 1\" display level
.nr ds*float-busy 0\" >0 if printing float
.nr ds*ffloat 0\" >0 if DF, 0 if DS
.\" static display start
.\" nested DS/DE is allowed. No limit on depth.
.de DS
.br
.ds@start 0 DS \\$@
..
.\" floating display start
.\" nested DF/DE is not allowed.
.de DF
.if \\n[ds*lvl] .@error "DF:nested floating is not allowed. Use DS."
.ds@start 1 DF \\$@
..
.\"---------------
.nr ds*format 0\" dummy value for .En/.EQ
.nr ds*format! 0\" no indent
.nr ds*format!0 0\" no indent
.nr ds*format!L 0\" no indent
.nr ds*format!I 1\" indent
.nr ds*format!1 1\" indent
.nr ds*format!C 2\" center each line
.nr ds*format!2 2\" center each line
.nr ds*format!CB 3\" center as block
.nr ds*format!3 3\" center as block
.nr ds*format!R 4\" right justify each line
.nr ds*format!4 4\" right justify each line
.nr ds*format!RB 5\" right justify as block
.nr ds*format!5 5\" right justify as block
.\"---------------
.nr ds*fill! 0\" no fill
.nr ds*fill!N 0\" no fill
.nr ds*fill!0 0\" no fill
.nr ds*fill!F 1\" fill on
.nr ds*fill!1 1\" fill on
.\"---------------
.de ds@start
.nr ds*ffloat \\$1
.ds ds*type \\$2
.shift 2
.nr ds*lvl +1
.\" get format of the display
.ie \\n[.$] \{\
. ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1]
. el .@error "\\*[ds*type]:wrong format:\\$1"
.\}
.el .nr ds*format 0
.\" fill or not to fill, that is the...
.nr ds*fill 0
.ie \\n[.$]>1 \{\
. ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2]
. el .@error "\\*[ds*type]:wrong fill:\\$2"
.\}
.nr ds*rindent 0
.if \\n[.$]>2 .nr ds*rindent \\$3
.\"
.\"
.nr ds*old-ll \\n[.l]
.misc@push ds-ll \\n[.l]
.misc@push ds-form \\n[ds*format]
.misc@push ds-ffloat \\n[ds*ffloat]
.nr ds*i \\n[.i]
.nr ds*ftmp \\n[.f]
.misc@ev-keep ds*ev!\\n+[ds*snr]
.ft \\n[ds*ftmp]
.\"
.init@reset
'in \\n[ds*i]u
.di ds*div!\\n[ds*snr]
.\"
.ll \\n[ds*old-ll]u
.if \\n[ds*rindent] .ll -\\n[ds*rindent]n
.if \\n[ds*wide] .ll \\n[@ll]u
.\"
.ie \\n[ds*fill] 'fi
.el 'nf
.\"
.if \\n[ds*format]=1 \{\
. ll -\\n[Si]n
' in +\\n[Si]n
.\}
.if (\\n[ds*format]=3):(\\n[ds*format]=5) 'in 0
..
.\"---------------
.de DE
.if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS or DF"
.br
.if \\n[ds*ffloat] .SP \\n[Lsp]u
.di
.nr ds*width \\n[dl]
.nr ds*height \\n[dn]
.misc@pop-nr ds-ll ds*old-ll
.misc@pop-nr ds-form ds*format
.misc@pop-nr ds-ffloat ds*ffloat
.if (\\n[ds*format]>=2)&(\\n[ds*width]>\\n[ds*old-ll]) \{\
. @error "DE: display too wide for current line-length"
.\}
.\" prepare copy to floating display
.if \\n[ds*ffloat] .di ds*fdiv!\\n+[ds*fnr]
.\"
'in 0
'nf
.if \\n[ds*format]=2 'ce 9999
.if \\n[ds*format]=3 'in (u;(\\n[ds*old-ll]-\\n[ds*width])/2)
.if \\n[ds*format]=4 'rj 9999
.if \\n[ds*format]=5 'in (u;\\n[ds*old-ll]-\\n[ds*width])
.\"
.ie !\\n[ds*ffloat] \{\
. \"
. \" Print static display
. \" Eject page if display will fit one page and
. \" there are less than half of the page left.
. nr ds*i \\n[pg*foot-trap]-\\n[pg*header-size]v
. if (\\n[ds*height]>\\n[ds*i])&(\\n[.t]<(\\n[ds*i]/2)) \{\
. ne \\n[.t]u+1v
. \}
. if (\\n[ds*height]<\\n[ds*i])&(\\n[.t]<(\\n[ds*height])) \{\
. ne \\n[.t]u+1v
. \}
. if \\n[Ds] .SP \\n[Lsp]u
.\}
.el .SP \\n[Lsp]u
.ds*div!\\n[ds*snr]
.ie !\\n[ds*ffloat] .if \\n[Ds] .SP \\n[Lsp]u
.el \{\
. SP \\n[Lsp]u
. di
.\}
.if \\n[ds*format]=2 'ce 0
.if \\n[ds*format]=4 'rj 0
.rm ds*div!\\n[ds*snr]
.nr ds*snr -1
.nr par@ind-flag 0
.\" move div to the floating display list
.ev
.if \\n[ds*ffloat] \{\
. nr ds*fsize!\\n[ds*fnr] \\n[dn]
. \" print float if queue is empty and the display fits into
. \" the current page
. if (\\n[ds*fnr]>\\n[ds*o-fnr])&(\\n[ds*height]<\\n[.t]) \{\
. ds@print-float 1
. \}
.\}
..
.\"---------------
.\" print according to Df and De.
.\" .ds@print-float type
.\" type called from
.\" 1 .DE
.\" 2 end of section
.\" 3 end of document
.\" 4 beginning of new page
.\"
.de ds@print-float
.if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5"
.if !\\n[ds*float-busy] \{\
. nr ds*float-busy 1
.\" at .DE
. if (\\$1=1)&((\\n[Df]%2)=1) \{\
. if \\n[.t]>\\n[ds*fsize!\\n[ds*fnr]] \{\
. \" Df = 1,3 or 5
. ds@print-one-float
. \}
. \}
.\" print all if Df<2 and end of section
. if (\\$1=2)&(\\n[Df]<2) .ds@print-all-floats
.\" print all if end of document. Where should they go instead?
. if \\$1=3 .ds@print-all-floats
.\" new page
. if (\\$1=4)&(\\n[Df]>1) \{\
. if \\n[Df]=2 .ds@print-one-float
. if \\n[Df]=3 .ds@print-one-float
. if \\n[Df]>3 \{\
. ie \\n[De] .ds@print-all-floats
. el .ds@print-this-page
. \}
. \}
. nr ds*float-busy 0
.\}
..
.\"---------------
.\" print a floating diversion
.de ds@output-div
.ev ds*fev
.in 0
.nf
.ds*fdiv!\\n[ds*o-fnr]
.ev
.rm ds*fdiv!\\n[ds*o-fnr]
.rm ds*fsize!\\n[ds*o-fnr]
.rm ds*fformat!\\n[ds*o-fnr]
.nr ds*o-fnr +1
..
.\"---------------
.\" print one floating display if there is one.
.de ds@print-one-float
.if \\n[ds*o-fnr]<=\\n[ds*fnr] \{\
. if \\n[.t]<\\n[ds*fsize!\\n[ds*o-fnr]] .pg@next-page
. ds@output-div
. if \\n[De] .pg@next-page
.\}
..
.\"---------------
.\" print all queued floats.
.\" if De>0 do a page eject between the floats.
.de ds@print-all-floats
.while \\n[ds*o-fnr]<=\\n[ds*fnr] \{\
. if \\n[.t]<\\n[ds*fsize!\\n[ds*o-fnr]] .pg@next-page
. ds@output-div
. if \\n[De] .pg@next-page
.\}
..
.\"---------------
.\" print as many floats as will fit on the current page
.de ds@print-this-page
.while \\n[ds*o-fnr]<=\\n[ds*fnr] \{\
. if \\n[.t]<\\n[ds*fsize!\\n[ds*o-fnr]] .break
. ds@output-div
.\}
..
.\"########### module list ###################
.\" .LI text-indent mark-indent pad type [mark [LI-space [LB-space] ] ]
.\"
.nr li*tind 0
.nr li*mind 0
.nr li*pad 0
.nr li*type 0
.ds li*mark 0
.nr li*li-spc 0
.nr li*lvl 0 1
.nr li*cur-vpos 0
.\"--------------------------
.\" the major list-begin macro.
.\" If type == -1 a 'break' will occur.
.de LB
.if \\n[.$]<4 .@error "LB: not enough arguments, min 4"
.misc@push cind \\n[.i]
.misc@push tind \\n[li*tind]
.misc@push mind \\n[li*mind]
.misc@push pad \\n[li*pad]
.misc@push type \\n[li*type]
.misc@push li-spc \\n[li*li-spc]
.ds li*mark-list!\\n[li*lvl] \\*[li*mark]
.nr li*lvl +1
.\"
.nr li*tind (n;0\\$1)\" text-indent
.nr li*mind (n;0\\$2)\" mark-indent
.nr li*pad (n;0\\$3)\" pad
.nr li*type 0\\$4\" type
.ds li*mark \\$5\" mark
.ie !'\\$6'' .nr li*li-spc \\$6\" LI-space
.el .nr li*li-spc 1
.ie !'\\$7'' .nr li*lb-spc \\$6\" LB-space
.el .nr li*lb-spc 0
.\" init listcounter
.nr li*cnt!\\n[li*lvl] 0 1
.\" assign format
.af li*cnt!\\n[li*lvl] 1
.if \\n[li*type] .if !'\\*[li*mark]'' .af li*cnt!\\n[li*lvl] \\*[li*mark]
.\"
.if \\n[li*lb-spc] .SP \\n[li*lb-spc]v/\\n[@ntc]u
.in +\\n[li*tind]u
..
.\"---------------
.de LI
.if \\n[li*lvl]<1 .@error "LI:no lists active"
.if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP \\n[li*li-spc]v/\\n[@ntc]u
.ne 2v
.\"
.ds li*c-mark \\*[li*mark]
.nr li*cnt!\\n[li*lvl] +1
.if \\n[li*type]=1 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]].
.if \\n[li*type]=2 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]])
.if \\n[li*type]=3 .ds li*c-mark (\\n[li*cnt!\\n[li*lvl]])
.if \\n[li*type]=4 .ds li*c-mark [\\n[li*cnt!\\n[li*lvl]]]
.if \\n[li*type]=5 .ds li*c-mark <\\n[li*cnt!\\n[li*lvl]]>
.if \\n[li*type]=6 .ds li*c-mark {\\n[li*cnt!\\n[li*lvl]]}
.if \\n[.$]=1 .ds li*c-mark \\$1
.if \\n[.$]=2 .ds li*c-mark \\$1\ \\*[li*c-mark]
.if '\\*[li*c-mark]'\ ' .ds li*c-mark
.\"
.\" determine where the text begins
.nr li*text-begin \\n[li*tind]>?\w'\\*[li*c-mark]\ '
.\"
.\" determine where the mark begin
.ie !\\n[li*pad] .nr li*in \\n[li*mind]
.el .nr li*in \\n[li*text-begin]-\\n[li*pad]-\w'\\*[li*c-mark]'
.if !\\n[li*in] .nr li*in 0
.\"
.ti -\\n[li*tind]u
.\" no indentation if hanging indent
.if (\w'\\*[li*c-mark]'=0)&((\\n[.$]=0):(\w'\\$1'=0)) .nr li*text-begin 0
\Z'\&\h'\\n[li*in]u'\\*[li*c-mark]'\h'\\n[li*text-begin]u'\&\c
.if \\n[li*type]=-1 .br
..
.\"
.\"-------------
.de li@pop
.nr li*lvl -1
.misc@pop-nr cind li*tmp
.in \\n[li*tmp]u
.misc@pop-nr tind li*tind
.misc@pop-nr mind li*mind
.misc@pop-nr pad li*pad
.misc@pop-nr type li*type
.misc@pop-nr li-spc li*li-spc
.ds li*mark \\*[li*mark-list!\\n[li*lvl]]
..
.de LE
.if \\n[li*lvl]<1 .@error "LE:mismatched"
.li@pop
.if '\\$1'1' .SP 1/\\n[@ntc]u
..
.\"-------------
.\" list status clear.
.de LC
.if !\\n[.$]=1 .@error "LC: no argument"
.if \\$1>\\n[li*lvl] .@error "LC: incorrect argument: \\$1 (too big)"
.while \\n[li*lvl]>\\$1 .li@pop
.nr par@ind-flag 0
..
.\"-------------
.de AL
.if \\n[.$]>3 .@error "AL: too many arguments"
.if \\n[D]>2 .tm AL $*
.ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1"
.el \{\
. ie \\n[.$]=2 .LB 0\\$2 0 2 1 "\\$1"
. el \{\
. ie !'\\$2'' .LB \\$2 0 2 1 "\\$1" 0 1
. el .LB \\n[Li] 0 2 1 "\\$1" 0 1
. \}
.\}
..
.de ML
.if \\n[.$]>3 .@error "ML: too many arguments"
.if \\n[D]>2 .tm ML $*
.nr li*ml-width \w'\\$1'u+1n
.if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1"
.if \\n[.$]=2 .LB 0\\$2 0 1 0 "\\$1"
.if \\n[.$]=3 \{\
. ie '\\$2'' .LB \\n[li*ml-width]u 0 1 0 "\\$1" 0 1
. el .LB \\n[Li] 0 1 0 "\\$1" 0 1
.\}
..
.de VL
.if \\n[D]>2 .tm VL $*
.if \\n[.$]>3 .@error "VL: too many arguments"
.if \\n[.$]<1 .@error "VL: missing text-indent"
.ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0
.el .LB 0\\$1 0\\$2 0 0 \& 0 1
..
.\" Bullet (for .BL)
.de BL
.if \\n[D]>2 .tm BL $*
.ds BU \s-2\(bu\s0
.if \\n[.$]>2 .@error "BL: too many arguments"
.if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU]
.if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU]
.if \\n[.$]=2 \{\
. ie '\\$1'' .LB \\n[Pi] 0 1 0 \\*[BU] 0 1
. el .LB 0\\$1 0 1 0 \\*[BU] 0 1
.\}
..
.de DL
.if \\n[D]>2 .tm DL $*
.if \\n[.$]>2 .@error "DL: too many arguments"
.if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em
.if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em
.if \\n[.$]=2 \{\
. ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1
. el .LB 0\\$1 0 1 0 \(em 0 1
.\}
..
.de RL
.if \\n[D]>2 .tm RL $*
.if \\n[.$]>2 .@error "RL: too many arguments"
.if \\n[.$]<1 .LB 6 0 2 4
.if \\n[.$]=1 .LB 0\\$1 0 2 4
.if \\n[.$]=2 \{\
. ie '\\$1'' .LB 6 0 2 4 1 0 1
. el .LB 0\\$1 0 2 4 1 0 1
.\}
..
.\" Broken Variable List. As .VL but text begin on the next line
.de BVL
.if \\n[D]>2 .tm BVL $*
.if \\n[.$]>3 .@error "BVL: too many arguments"
.if \\n[.$]<1 .@error "BVL: missing text-indent"
.ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1
.el .LB 0\\$1 0\\$2 0 -1 \& 0 1
..
.\" ####### module tbl #######################################
.\" This module is copied from groff_ms and modified for mgm.
.\" Yes, it does not resemble the original anymore :-).
.\" Don't know if I missed something important.
.\" Groff_ms is written by James Clark.
.nr tbl*have-header 0
.nr tbl*header-written 0
.de TS
.br
.if '\\$1'H' .di tbl*header-div
..
.de tbl@top-hook
.if \\n[tbl*have-header] \{\
. ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl@print-header
. el .sp \\n[.t]u
.\}
..
.de tbl@bottom-hook
.if \\n[tbl*have-header] \{\
. nr T. 1
.\" draw bottom and side lines of boxed tables.
. T#
.\}
.nr tbl*header-written 0
..
.de tbl@print-header
.ev tbl*ev
'nf
.tbl*header-div
.ev
.mk #T
.nr tbl*header-written 1
..
.de TH
.ie '\\n[.z]'tbl*header-div' \{\
. nr T. 0
. T#
. br
. di
. nr tbl*header-ht \\n[dn]
. ne \\n[dn]u+1v
. nr tbl*have-header 1
. ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header
. el .tbl@print-header
.\}
.el .@error ".TH without .TS H"
..
.de TE
.ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE"
.el \{\
. nr tbl*have-header 0
.\}
.\" reset tabs
.TAB
..
.de T&
..
.\" ####### module pic #######################################
.de PS
.nr pic*in 0
.br
.SP .5
.ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic."
.el \{\
. if !\\n[ds*lvl] .ne (u;\\$1)+1v
.\" should be contained between .DS/.DE
.if r ds*format \{\
. if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\
. nr pic*in \\n[.i]
.\" . in +(u;\\n[.l]-\\n[.i]-\\$2/2)
. \}
. \}
.\}
..
.de PE
.init@reset
.SP .5
..
.\" ####### module eq #######################################
.\"
.nr eq*number 0 1
.de EQ
.ds eq*lable "\\$1
.di eq*div
.misc@ev-keep eq*ev
.in 0
.nf
..
.de EN
.br
.di
.ta
.\" equation with lable.
.if \\n[dl] \{\
. br
. chop eq*div
. ie (\\n[Eq]%2) \{\
. \" lable to the left
. if \\n[ds*format]<2 \{\
. ta (u;(\\n[.l]/7)+\\n[.i]) \\n[.l]u\" L
\\*[eq*lable]\t\\*[eq*div]\t\&
. \}
. if (\\n[ds*format]=2):(\\n[ds*format]=3) \{\
. ta (u;(\\n[.l]-\\n[.i])/2+\\n[.i])C \\n[.l]u\" C
\\*[eq*lable]\t\\*[eq*div]\t\&
. \}
. if \\n[ds*format]>3 \{\
. ta \\n[.l]uR\" R
\\*[eq*lable]\t\\*[eq*div]
. \}
. \}
. el \{\
. \" lable to the right
. if \\n[ds*format]<2 \{\
. ta \\n[.l]uR\" L
\\*[eq*div]\t\\*[eq*lable]
. \}
. if (\\n[ds*format]=2):(\\n[ds*format]=3) \{\
. ta (u;(\\n[.l]-\\n[.i])/2+\\n[.i])C \\n[.l]uR\" C
\t\\*[eq*div]\t\\*[eq*lable]
. \}
. if \\n[ds*format]>3 \{\
. ta (\\n[.l]u-\w'\\*[eq*lable]'u-1m)R \\n[.l]uR\" R
\t\\*[eq*div]\t\\*[eq*lable]
. \}
. \}
.\}
.TAB
.ev
..
.\"########### module toc ###################
.\" table of contents
.nr toc*slevel 1
.nr toc*spacing 1v/\n[@ntc]u
.nr toc*tlevel 2
.nr toc*tab 0
.\"-----------
.\" Table of contents with friends (module lix)
.de TC
.br
.\" print any pending displays
.pg@end-of-text
.if \w'\\$1'>0 .nr toc*slevel \\$1
.if \w'\\$2'>0 .nr toc*spacing \\$2v/\\n[@ntc]u
.if \w'\\$3'>0 .nr toc*tlevel \\$3
.if \w'\\$4'>0 .nr toc*tab \\$4
.if \\n[pg*cols-per-page]>1 .1C
.pg@clear-hd
.pg@next-page
.pg@clear-ft
.\"-------------
.if d Ci .toc@read-Ci \\*[Ci]
.nf
.in 0
.nr toc*pn 0 1
.af toc*pn i
.PF "''\\\\\\\\n+[toc*pn]''"
.nr toc*i 4 1
.while \\n+[toc*i]<10 \{\
. if !'\\$\\n[toc*i]'' \{\
. ce
\\$\\n[toc*i]
. br
. \}
.\}
.if \\n[.$]<=4 .if d TX .TX
.ie d TY .if \\n[.$]<=4 .TY
.el \{\
. ce
\\*[Licon]
. br
. SP 3
.\}
.toc*list
.\" print LIST OF XXX
.if d lix*dsfg .lix@print-ds fg "\\*[Lf]"
.if d lix*dstb .lix@print-ds tb "\\*[Lt]"
.if d lix*dsec .lix@print-ds ec "\\*[Le]"
.if d lix*dsex .lix@print-ds ex "\\*[Lx]"
..
.\"-----------
.\" .toc@read-Ci lev1 lev2 lev3 lev4 ... lev7
.de toc@read-Ci
.nr toc*i 0 1
.while \\n+[toc*i]<8 \{\
. nr toc*hl!\\n[toc*i] \\$\\n[toc*i]
.\}
..
.\"-----------
.de toc@save
.\" collect maxsize of mark if string Ci don't exist.
.if !d Ci \{\
. if !r toc*hl!\\$1 .nr toc*hl!\\$1 0
. if \\n[toc*hl!\\$1]<=\w'\\$2' \{\
. nr toc*hl!\\$1 \w'\\$2'u+1m
. \}
.\}
.am toc*list
.\" .toc@set level headernumber text pagenr
.toc@set \\$1 "\\$2" "\\$3" "\\$4"
\\..
..
.\"-----------
.\" level mark text pagenumber
.de toc@set
.if \\$1<=\\n[toc*slevel] .SP \\n[toc*spacing]u
.ne 2v
.na
.fi
.nr toc*ind 0
.nr toc*i 0 1
.ie d Ci \{\
. nr toc*ind +\\n[toc*hl!\\$1]u
.\}
.el \{\
. while \\n+[toc*i]<\\$1 \{\
. nr toc*ind +\\n[toc*hl!\\n[toc*i]]u
. \}
.\}
.nr toc*text \\n[toc*ind]u+\\n[toc*hl!\\$1]u
.in \\n[toc*text]u
.ti -\\n[toc*hl!\\$1]u
.\"
.\" length of headernum space
.nr toc*i \\n[toc*hl!\\$1]-\w'\\$2'
.\"
.ll \\n[@ll]u-\w'\\$4'u-2m
.\" ragged right ---------------------------------
.ie \\$1>\\n[toc*tlevel] \{\
\\$2
. sp -1
\\$3\ \ \ \\$4
. br
.\}
.el \{\
. \" unnumbered heading --------------------
. ie '\\$2'' \{\
. in \\n[toc*ind]u
\\$3\h'1m'
. \}
. \" normal heading ------------------------
. el \{\
\\$2
. sp -1
\\$3\h'1m'
. \}
. ll \\n[@ll]u
. sp -1
. nr toc*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w'\\$4')-1m
\h'|\\n[.n]u'\l'\\n[toc*sep]u.'\h'1m'\\$4
.\}
.ll \\n[@ll]u
..
.\"########################### module lix ############################
.\" LIST OF figures, tables, exhibits and equations
.nr lix*fg-nr 0 1
.nr lix*tb-nr 0 1
.nr lix*ec-nr 0 1
.nr lix*ex-nr 0 1
.aln Fg lix*fg-nr
.aln Tb lix*tb-nr
.aln Ec lix*ec-nr
.aln Ex lix*ex-nr
.\"------------
.de FG
.lix@print-line fg Lf \\n+[lix*fg-nr] "\\$1" "\\$2" "\\$3" "\\$4"
..
.de TB
.lix@print-line tb Lt \\n+[lix*tb-nr] "\\$1" "\\$2" "\\$3" "\\$4"
..
.de EC
.lix@print-line ec Le \\n+[lix*ec-nr] "\\$1" "\\$2" "\\$3" "\\$4"
..
.de EX
.lix@print-line ex Lx \\n+[lix*ex-nr] "\\$1" "\\$2" "\\$3" "\\$4"
..
.\"------------
.\" print line with 'figure' in the text
.\" type stringvar number text override flag refname
.de lix@print-line
.ds lix*text "\\$4
.ie !\\n[Of] .ds lix*ds-form .\ \ \"
.el .ds lix*ds-form "\ \(em\ \"
.nr lix*in \\n[.i]
.ds lix*lable \\*[Li\\$1]\ \\$3\\*[lix*ds-form]
.if !'\\$5'' \{\
. if !0\\$6 .ds lix*lable \\*[Li\\$1]\ \\$5\\$3\\*[lix*ds-form]
. if 0\\$6=1 .ds lix*lable \\*[Li\\$1]\ \\$3\\$5\\*[lix*ds-form]
. if 0\\$6=2 .ds lix*lable \\*[Li\\$1]\ \\$5\\*[lix*ds-form]
.\}
.ds lix*pgnr \\n[%]
.\" print line if not between DS/DE
.ie \\n[ds*lvl]<1 .lix@print-text "\\*[lix*lable]" "\\*[lix*text]"
.el .lix@embedded-text "\\*[lix*lable]" "\\*[lix*text]"
.\"
.\" save line for LIST OF XXX
.if !r lix*wth\\$1 .nr lix*wth\\$1 0
.if \w'\\*[lix*lable]'>\\n[lix*wth\\$1] .nr lix*wth\\$1 \w'\\*[lix*lable]'
.if \\n[\\$2] .lix@ds-save \\$1 \\*[lix*pgnr] "\\$4" "\\*[lix*lable]"
.if !'\\$7'' .SETR \\$7 \\$3
..
.\"-----------
.de lix@print-text
.SP \\n[Lsp]u
.misc@ev-keep lix
.init@reset
.br
.ie (\w'\\$1\\$2')>(\\n[.l]-\\n[.i]) \{\
. in +\w'\\$1'u
. ti 0
.\}
.el .ce 1
\fB\\$1\fP\\$2
.br
.ev
..
.\" hide printout until diversion is evaluated
.de lix@embedded-text
\!.SP \\n[Lsp]u
\!.misc@ev-keep lix
\!.init@reset
\!.br
\!.ie (\w'\\$1\\$2')>(\\n[.l]-\\n[.i]) \{\
\!. in +\w'\\$1'u
\!. ti 0
\!.\}
\!.el .ce 1
\!\fB\\$1\fP\\$2
\!.br
\!.ev
..
.\"------------
.\" print complete list of XXXX
.de lix@print-ds
.\" arg: fg,tb,ec,ex text
.if !\\n[Cp] .pg@next-page
.\" print LIST OF XXXX
.ce
\\$2
.SP 3
.in \\n[lix*wth\\$1]u
.fi
.lix*ds\\$1
..
.\"------------
.\" save line of list in macro
.de lix@ds-save
.\" type pagenumber text
.am lix*ds\\$1
.lix@dsln \\$1 \\$2 "\\$3" "\\$4" \\$5
\\..
..
.\"------------
.\" print appended macro
.\" lix@dsln type pagenumber text headernr
.de lix@dsln
.nr lix*i \\n[lix*wth\\$1]-\w'\\$4'
.ne 2v
.ll -4m
.ti 0
\h'\\n[lix*i]u'\\$4\\$3
.sp -1
.ll
.ti \\n[.l]u-\w'\\$2'u
\\$2
..
.\"########################### module fnt ############################
.\" some font macros.
.de R
.ft R
.ul 0
..
.\"-----------
.de fnt@switch
.ul 0
.ds fnt*tmp
.nr fnt*prev \\n[.f]
.nr fnt*i 2 1
.while \\n+[fnt*i]<=\\n[.$] \{\
. if \\n[fnt*i]>3 .as fnt*tmp \,
. ie (\\n[fnt*i]%2)=1 .as fnt*tmp \\$1\\$[\\n[fnt*i]]
. el .as fnt*tmp \\$2\\$[\\n[fnt*i]]
. if \\n[fnt*i]<\\n[.$] .as fnt*tmp \/
.\}
\\*[fnt*tmp]\f[\\n[fnt*prev]]
..
.\"-----------
.de B
.ie \\n[.$] .fnt@switch \fB \f[\\n[.f]] \\$@
.el .ft B
..
.de I
.ie \\n[.$] .fnt@switch \fI \f[\\n[.f]] \\$@
.el .ft I
..
.de IB
.if \\n[.$] .fnt@switch \fI \fB \\$@
..
.de BI
.if \\n[.$] .fnt@switch \fB \fI \\$@
..
.de IR
.if \\n[.$] .fnt@switch \fI \fR \\$@
..
.de RI
.if \\n[.$] .fnt@switch \fR \fI \\$@
..
.de RB
.if \\n[.$] .fnt@switch \fR \fB \\$@
..
.de BR
.if \\n[.$] .fnt@switch \fB \fR \\$@
..
.\"########################### module box ############################
.\" draw a box around some text. Text will be kept on the same page.
.\"
.nr box*ll 0
.\" .B1 and .B2 works like .DS
.de B1
.if \\n[box*ll] .@error "B1: missing B2"
.nr box*ll \\n[.l]
.nr box*ind \\n[.i]
.nr box*hyp \\n[.hy]
.in +1n
.ll -1n
.di box*div
.hy \\n[.hy]
..
.de B2
.if !\\n[box*ll] .@error "B2: missing B1"
.br
.di
.nr box*height \\n[dn]
.ne \\n[dn]u+1v
.ev box*ev
.ll \\n[box*ll]u
.in 0
.nr box*y-pos \\n[.d]u
.nf
.box*div
.fi
\v'-1v+.25m'\
\D'l \\n[.l]u 0'\
\D'l 0 -\\n[box*height]u'\
\D'l -\\n[.l]u 0'\
\D'l 0 \\n[box*height]u'
.br
.sp -1
.ev
.sp .20v
.in \\n[box*ind]u
.ll \\n[box*ll]u
.rm box*div
.nr box*ll 0
..
.\"########################### module ref ############################
.nr ref*nr 0 1
.nr ref*nr-width 5n
.ds Rf \v'-.4m'\s-3[\\n+[ref*nr]]\s0\v'.4m'
.\" start reference
.de RS
.if !''\\$1' .ds \\$1 \\n[ref*nr]
.ev ref*ev
.da ref*div
.init@reset
.ll \\n[@ll]u
.in \\n[ref*nr-width]u
.ti -(\w'\\n[ref*nr].'u+1n)
\\n[ref*nr].
.sp -1
..
.de RF
.br
.if \\n[Ls] .SP 1/\\n[@ntc]u
.di
.ev
..
.de RP
.if !d ref*div .@error "RP: No references!"
.nr ref*i 0\\$2
.if \\n[ref*i]<2 .SK
.SP 2
.nr ref@toc-lvl 1
.\" Indent one level if each section has references (N=3)
.if \\n[pg*ref-reset] .nr ref@toc-lvl 2
.toc@save \\n[ref@toc-lvl] "" "\\*[Rp]" "\\*[pg*toc-pn-fmt]"
.ev ref*ev
.ce
\fI\\*[Rp]\fP
.sp
.in 0
.nf
.ref*div
.in
.if 0\\$1<1 .nr ref*nr 0 1
.rm ref*div
.ev
.if (\\n[ref*i]=0):(\\n[ref*i]=2) .SK
..
.\"########################### module app ############################
.\"
.nr app*nr 0 1
.af app*nr A
.nr app*dnr 0 1
.\"------------
.\" .APP name text
.\" name == "" -> autonumber
.de APP
.if \\n[.$]<2 .@error "APP: too few arguments"
.app@set-ind "\\$1"
.\"
.ie \\n[Aph] .app@header \\*[app*ind] "\\$2"
.el .bp
.app@index "\\*[app*ind]" "\\$2"
..
.\"------------
.\" .APPSK name pages text
.\" name == "" -> autonumber
.de APPSK
.if \\n[.$]<2 .@error "APPSK: too few arguments"
.app@set-ind "\\$1"
.\"
.ie \\n[Aph] .app@header \\*[app*ind] "\\$3"
.el .bp
.app@index "\\*[app*ind]" "\\$3"
.pn +\\$2
..
.\"------------
.de app@set-ind
.ie \w'\\$1' .ds app*ind \\$1
.el \{\
. if !\\n[app*dnr] \{\
. nr H1 0 1
. af H1 A
. \}
. ds app*ind \\n+[app*nr]
. nr H1 \\n+[app*dnr]
.\}
.\" clear lower counters
.nr app*i 1 1
.while \\n+[app*i]<8 .nr H\\n[app*i] 0 1
..
.\"------------
.de app@index
.toc@save 1 "" "\\*[App] \\$1: \\$2" "\\*[pg*toc-pn-fmt]"
..
.\"------------
.\" app@heaer name text
.de app@header
.bp
.SP \\n[Lsp]u*4u
.ce 1
\s+4\fB\\*[App]\ \\$1\fP\s0
.SP \\n[Lsp]u*2u
.if \w'\\$2'<\\n[.l] .ce 1
\fB\s+2\\$2\s0\fP
.SP \\n[Lsp]u*4u
..
.\"########################### module cov ############################
.\" title stored in diversion cov*title
.\" abstract stored in diversion cov*abstract
.\" arg to abstract stored in cov*abs-arg
.\" indent stored in cov*abs-ind
.\" number of authors stored in cov*au
.\" author(s) stored in cov*au!x!y
.\" author(s) title stored in cov*at!x!y
.\" x is the author-index [1-cov*au], y is the argument-index [1-9].
.\" author(s) firm stored in cov*firm
.\" new date (if .ND exists) is stored in cov*new-date
.\"
.\"
.nr cov*au 0
.de TL
.if \\n[.$]>0 .ds cov*title-charge-case \\$1
.if \\n[.$]>1 .ds cov*title-file-case \\$2
.pg@disable-top-trap
.ev cov*ev
.init@reset
.hy 0
.eo
.di cov*title
..
.\"-------------------
.de cov@title-end
.ec
.if '\\n[.z]'cov*title' \{\
. br
. di
. asciify cov*title
. ev
.\}
..
.\"-------------------
.\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]
.de AU
.cov@title-end
.pg@disable-top-trap
.if \\n[.$]<1 .@error "AU: no arguments"
.nr cov*au +1
.nr cov*i 0 1
.while \\n[.$]>=\\n+[cov*i] \{\
. ds cov*au!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
.\}
.if (\\n[.$]>=3)&(\w'\\$3') \{\
. if d cov*location-\\$3] \{\
. ds cov*au!3!\\n[cov*au] \\*[cov*location-\\$3]
. \}
.\}
..
.\"-------------------
.\" .AT title1 [title2 [... [title9] ]]]]
.\" Well, thats all that COVEND look for.
.\" Must appear directly after .AU
.de AT
.if \\n[.$]<1 .@error "AT: no arguments"
.nr cov*i 0 1
.while \\n[.$]>=\\n+[cov*i] \{\
. ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
.\}
..
.\"-------------------
.de AF
.cov@title-end
.if \\n[.$]<1 .@error "AF: no arguments"
.ds cov*firm \\$1
..
.de AS
.pg@disable-top-trap
.if d cov*abstract .@error "AS: only one abstract allowed"
.if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)"
.nr cov*abs-arg 0\\$1
.nr cov*abs-ind (n;0\\$2)
.misc@ev-keep cov*ev
.init@reset
.nf
.de cov*abstract AE
..
.de AE
.ev
..
.\" I am planning to use mgm some time :-)
.ie \\n[yr]<50 .ds cov*new-date \\*[MO\\n[mo]] \\n[dy], 20\\n[yr]
.el .ds cov*new-date \\*[MO\\n[mo]] \\n[dy], 19\\n[yr]
.als DT cov*new-date
.de ND
.\" don't remember why I did this: .pg@disable-top-trap
.ds cov*new-date \\$1
..
.\"-------------------
.\" save technical numbers.
.de TM
.nr cov*i 0 1
.while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]]
.nr cov*mt-tm-max \\n[.$]
..
.\"-----------------------
.\" cover sheet
.\" the file must have the following last lines (somewhere):
.\" .pg@enable-top-trap
.\" .bp 1
.\" .pg@enable-trap
.ds cov*mt-file!0 0.MT
.ds cov*mt-file!1 0.MT
.ds cov*mt-file!2 0.MT
.ds cov*mt-file!3 0.MT
.ds cov*mt-file!4 4.MT
.ds cov*mt-file!5 5.MT
.ds cov*mt-file!6 0.MT
.\"------------
.de MT
.ie \\n[.$] \{\
. ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1
. el .ds cov*mt-type 6
.\}
.el .ds cov*mt-type 1
.ds cov*mt-addresse "\\$2
.ds cov*mt-type-text "\\$1
.ie d @language .ds cov*str mm/\\*[@language]_
.el .ds cov*str mm/
.mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]]
..
.de COVER
.ie !\\n[.$] .ds cov*cov-type ms
.el .ds cov*cov-type \\$1
.pg@disable-top-trap
.ie d @language .ds cov*str mm/\\*[@language]_\\*[cov*cov-type].cov
.el .ds cov*str mm/\\*[cov*cov-type].cov
.mso \\*[cov*str]
..
.\"########################### module qrf ############################
.\" forward and backward reference thru special files.
.\"
.\" init reference system
.de INITR
.if \\n[.$]<1 .@error "INITR:filename missing"
.\" ignore if INITR has already been used
.if !r qrf*pass \{\
.\"
. ds qrf*file \\$1
. sy test -f \\*[qrf*file].tmp
. ie \\n[systat] \{\
. \" PASS 1
. if \\n[D]=1 .tm PASS 1
. if \\n[D]>1 .tm INITR: file \\*[qrf*file].tmp, PASS 1
. nr qrf*pass 1
. open qrf*stream \\*[qrf*file].tmp
. write qrf*stream .\\\\" references for \\*[qrf*file]
. close qrf*stream
. \}
. el \{\
. nr qrf*pass 2
. if \\n[D]=1 .tm PASS 2
. if \\n[D]>1 .tm INITR: file \\*[qrf*file].tmp, PASS 2
. sy mv \\*[qrf*file].tmp \\*[qrf*file].qrf
' so \\*[qrf*file].qrf
. \}
.\}
..
.\"---------------
.\" set a reference.
.de SETR
.if \\n[.$]<1 .@error "SETR:reference name missing"
.ie !r qrf*pass .tm "SETR: No .INITR in this file"
.el \{\
. ds qrf*name qrf*ref-\\$1
.\" probably pass two if already defined
. if \\n[qrf*pass]<2 \{\
. if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd*toc-mark],\\n[%]
. \" heading-number
. ds \\*[qrf*name]-hn \\*[hd*toc-mark]
. \" page-number
. ds \\*[qrf*name]-pn \\n[%]
. \"
. \" append to file
. opena qrf*stream \\*[qrf*file].tmp
. write qrf*stream .ds \\*[qrf*name]-hn \\*[hd*toc-mark]
. write qrf*stream .ds \\*[qrf*name]-pn \\n[%]
. if !'\\$2'' .write qrf*stream .ds \\*[qrf*name]-xx \\$2
. close qrf*stream
. \}
.\}
..
.\"---------------
.\" get misc-string, output <->42<-> in pass 1
.\" If two arg -> set var. arg to misc-string.
.de GETST
.if \\n[.$]<1 .@error "GETST:reference name missing"
.if !r qrf*pass .tm "GETST: No .INITR in this file"
.ds qrf*name qrf*ref-\\$1
.ie \\n[qrf*pass]=2 \{\
. ie !d \\*[qrf*name]-xx .tm "GETHN:\\$1 not defined"
. el \{\
. ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx]
. el \\*[\\*[qrf*name]-xx]\c
. \}
.\}
.\" The answer...
.el <->42<->\c
..
.\"---------------
.\" get header-number, output X.X.X. in pass 1
.\" If two arg -> set var. arg to header-number.
.de GETHN
.if \\n[.$]<1 .@error "GETHN:reference name missing"
.if !r qrf*pass .tm "GETHN: No .INITR in this file"
.ds qrf*name qrf*ref-\\$1
.ie \\n[qrf*pass]=2 \{\
. ie !d \\*[qrf*name]-hn .tm "GETHN:\\$1 not defined"
. el \{\
. ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn]
. el \\*[\\*[qrf*name]-hn]\c
. \}
.\}
.el X.X.X.\c
..
.\"---------------
.\" get page-number, output 9999 in pass 1
.\" If two arg -> set var. arg to page-number.
.de GETPN
.if \\n[.$]<1 .@error "GETPN:reference name missing"
.if !r qrf*pass .tm "GETPN: No .INITR in this file"
.ds qrf*name qrf*ref-\\$1
.ie \\n[qrf*pass]=2 \{\
. ie !d \\*[qrf*name]-pn .tm "GETPN:\\$1 not defined"
. el \{\
. ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn]
. el \\*[\\*[qrf*name]-pn]\c
. \}
.\}
.el 9999\c
..
.\"----------
.de GETR
.if \\n[.$]<1 .@error "GETR:reference name missing"
.ie !r qrf*pass \{\
. tm "GETR: No .INITR in this file"
.\}
.el \{\
. if \\n[qrf*pass]=2 \{\
. GETHN \\$1 Qrfh
. GETPN \\$1 Qrfp
\\*[Qrf]
. \}
.\}
..